#include "Double_list.h"
Double
// 初始化
Link_list *init_link_list(void)
{
    Link_list *L = (Link_list *)malloc(sizeof(Link_list));
    if (NULL == L)
    {
        printf("创建失败！");
    }
    L->next = NULL;
    return L;
}
// // 尾插
// void tail_insert_node(Link_list *list, Elenemt_data data)
// { // 创建节点

// }
// 中间插
void insert_node(Link_list *list, Elenemt_data data, int pos)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return;
    }
    if (0 >= pos)
    {
        printf("请不要乱搞\n");
    }

    // 定义新节点
    Node *new_node = (Node *)malloc(sizeof(Node));
    if (NULL == new_node)
    {
        printf("创建失败！");
        return;
    }

    new_node->data = data;
    new_node->next = NULL;
    // 定义结点指针
    Node *ptr = list->next;
    // 头插
    if (1 == pos)
    {
        new_node->next = list->next;
        if (NULL != ptr) // 判断后一个节点是否是NULL
        {
            list->next->prev = new_node;
        }
        list->next = new_node;
        return;
    }
    // 任意位置插
    for (int i = 1; i < pos - 1 && NULL != ptr; i++)
    {
        ptr = ptr->next;
    }
    if (ptr == NULL)
    {
        free(new_node);
        return;
    }

    new_node->next = ptr->next;
    if (NULL != ptr->next)
    {
        ptr->next->prev = new_node;
    }
    new_node->prev = ptr;
    ptr->next = new_node;
    return;
}
// 任意位置删
void delete_node(Link_list *list, int pos)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return;
    }
    if (NULL == list->next)
    {
        printf("表内无数据\n");
        return;
    }

    // 创建链表指针
    Node *ptr1 = list->next;
    Node *ptr2 = ptr1->next;
    // 头删
    if (1 == pos)
    {
        list->next = ptr1->next;
        free(ptr1);

        ptr2->prev = NULL;
        return;
    }
    // 循环到要删除节点的前一个节点
    for (int i = 1; i < pos - 1; i++)
    {
        ptr1 = ptr1->next;
    }
    // ptr2 指向要删除的节点
    ptr2 = ptr1->next;
    // ptr1指向要删除的后一个节点
    ptr1->next = ptr2->next;
    // 判断删除节点是否为最后一个节点
    if (NULL != ptr2->next)
    {
        ptr2->next->prev = ptr1;
    }
    // 释放要删除的节点
    free(ptr2);
}
// // 位置查数据
// Node *find_node_id(Link_list *list, int pos)
// {
//     if (NULL == list)
//     {
//         printf("list为NULL\n");
//         return NULL;
//     }
//     if (NULL == list->next)
//     {
//         printf("list的数据为NULL\n");
//         return NULL;
//     }
// }
// 名字查数据
int *find_node_name(Link_list *list, char *name)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return NULL;
    }
    if (NULL == list->next)
    {
        printf("list的数据为NULL\n");
        return NULL;
    }
    // 创建节点
    Node *ptr = list->next;
    for (int i = 0; NULL != ptr; i++)
    {
        if (!strcmp(ptr->data.name, name))
        {
            printf("找到帐号了！\n");
            return i+1;
        }
        ptr = ptr->next;
    }
    printf("没有找到帐号！\n");
    return NULL;
}
// 合并(链表去尾接上另一个链表的第一个节点)
// Link_list *merge_link_lists(Link_list *list1, Link_list *list2)
// {
//     if (NULL == list1 || NULL == list2)
//     {
//         printf("list为NULL\n");
//         return NULL;
//     }
//     if (NULL == list1->next && NULL == list2->next)
//     {
//         printf("list.next为NULL\n");
//         return NULL;
//     }
//     // Link_list * L = init_link_list();
//     Node *ptr1 = list1->next;
//     Node *ptr2 = list2->next;
//     for (int i = 0; NULL != ptr1->next; i++)
//     {
//         ptr1 = ptr1->next;
//     }
//     ptr1->next = ptr2;
//     return list1;
// }
Link_list *merge_link_lists(Link_list *list1, Link_list *list2)
{
    if (NULL == list1 || NULL == list2)
    {
        printf("list为NULL\n");
        return NULL;
    }
    if (NULL == list1->next && NULL == list2->next)
    {
        printf("list.next为NULL\n");
        return NULL;
    }
    Link_list *L = (Link_list *)malloc(sizeof(Link_list));
    L = init_link_list();
    Node *ptr_1 = list1->next;
    Node *ptr_2 = list2->next;
    int i = 1;
    for (; NULL != ptr_1; i++)
    {

        insert_node(L, ptr_1->data, i);
        ptr_1 = ptr_1->next;
    }
    for (; NULL != ptr_2; i++)
    {

        insert_node(L, ptr_2->data, i);
        ptr_2 = ptr_2->next;
    }
    return L;
}

// 清空youwenti
void clear_link_list(Link_list *list)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return;
    }
    if (NULL == list->next)
    {
        printf("list.next为NULL\n");
        return;
    }
    Node *ptr_1 = list->next;
    Node *ptr_2 = ptr_1->next;
    for (int i = 0; NULL != ptr_1; i++)
    {
        free(ptr_1);
        ptr_1 = ptr_2;
        if (NULL != ptr_2)
        {
            ptr_2 = ptr_2->next;
        }
    }
    list->next = NULL;
    return;
}
//  遍历
void print_link_list(Link_list *list)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return;
    }
    if (NULL == list->next)
    {
        printf("表内无数据\n");
        return;
    }
    Node *ptr = list->next;
    for (int i = 0; NULL != ptr; i++)
    {
        printf("账号%s\t 密码%s\t  身份 %c\n",
               ptr->data.name, ptr->data.word, ptr->data.level);
        ptr = ptr->next;
    }
}
// 销毁
void free_link_list(Link_list **list)
{
    if (NULL == *list)
    {
        printf("数据为NULL\n");
        return;
    }
    if (NULL == (*list)->next)
    {
        printf("表内无数据,已销毁头节点\n");
        free(*list);
        *list = NULL;
        return;
    }
    Node *ptr_1 = (*list)->next;
    Node *ptr_2 = ptr_1->next;
    for (int i = 0; NULL != ptr_1; i++)
    {
        free(ptr_1);
        ptr_1 = ptr_2;
        if (NULL != ptr_1)
        {
            ptr_2 = ptr_2->next;
        }
    }
    free(*list);
    *list = NULL;
}

// 注册
void zhuce(Link_list *L)
{
    Elenemt_data Stu_data;
    char user1[128];
    char word1[128];
    char level_1;

    printf("请输入要注册的账号：");
    scanf("%s", user1);
    printf("\n");
    printf("请输入一个密码用于账号登陆：");
    scanf("%s", word1);
    printf("\n");
    strcpy(Stu_data.name, user1);
    strcpy(Stu_data.word, word1);
    Stu_data.level = 'n';
    insert_node(L, Stu_data, 1);
    // tail_insert_node(L, Stu_data);
    printf("恭喜您注册为普通用户!\n");
}

// 登录
void denglu(Link_list *L1, Link_list *L2)
{
    char user1[128];
    char word1[128];
    // bian_li(sp);

    for (int j = 3; j > 0;)
    {
        Node *ptr1 = L1->next;
        Node *ptr2 = L2->next;
        printf("请输入账号：");
        scanf("%s", user1);
        printf("\n");
        printf("请输入密码：");
        scanf("%s", word1);
        printf("\n");
        // 普通用户数据遍历
        for (int i = 0; NULL != ptr1; i++)
        {
            if (!strcmp(ptr1->data.name, user1))
            {
                // printf("账号正确！");
                if (!strcmp(ptr1->data.word, word1))
                {
                    if (ptr1->data.level == 'n')
                    {
                        printf("恭喜普通用户进入系统！\n");
                        return;
                    }
                }
            }
            ptr1 = ptr1->next;
        }
        // 管理员用户遍历
        for (int i = 0; NULL != ptr2; i++)
        {
            if (!strcmp(ptr2->data.name, user1))
            {
                // printf("账号正确！");
                if (!strcmp(ptr2->data.word, word1))
                {
                    if (ptr2->data.level == 'y')
                    {
                        printf("恭喜管理员用户进入系统！\n");
                        return;
                    }
                }
            }
            ptr2 = ptr2->next;
        }
        printf("账号或密码错误\n");
        printf("您还有%d次机会\n", --j);
    }
}

void gai_user(Link_list *L1, Link_list *L2)
{
    Node *N;
    int num;
    char buf[128];
    printf("请输入要修改的账号\n");
    scanf("%s", buf);
    N = find_node_name(L2, buf);
    printf("1修改用户等级\t2修改用户账号\t3修改用户密码\n");
    scanf("%d", &num);
    switch (num)
    {
    case 1:
        printf("恭喜成为管理员\n");
        strcpy(N->data.level, 'y');
        num =  find_node_name(L1,N->data.name)
        // 任意位置删
        delete_node(L1, num);
        // 中间插
        insert_node(L2, N->data, 1);
        break;
    case 2:
        printf("请输入要修改的账号\n");
        scanf("%s", buf);
        if (NULL != N)
        {
            strcpy(N->data.name, buf);
        }
        break;
    case 3:
        printf("请输入要修改的密码\n");
        scanf("%s", buf);
        if (NULL != N)
        {
            strcpy(N->data.word, buf);
        }
        break;
    default:
        break;
    }
}